﻿using System;
using System.Security.Principal;
using DomainModel;
using Repository.Abstract;
using Services.Abstract;

namespace Services.Concrete
{
    public class StudyYearService : Service<StudyYear>, IStudyYearService
    {
        private readonly IStudyYearRepository _studyYearRepository;

        public StudyYearService(IStudyYearRepository studyYearRepository, IPrincipal currentUser, IPermissionService permissionService)
            : base(studyYearRepository, currentUser, permissionService)
        {
            _studyYearRepository = studyYearRepository;
        }

        public new void Delete(StudyYear studyYear)
        {
            if (!PermissionService.CanCUDSemesters())
                throw new Exception("Недостаточно прав для CUD операций с учебными годами.");

            base.Delete(studyYear);
        }

        public new void SaveOrUpdate(StudyYear studyYear)
        {
            if (!PermissionService.CanCUDSemesters())
                throw new Exception("Недостаточно прав для CUD операций с учебными годами.");

            base.Delete(studyYear);

            if (studyYear == null)
            {
                throw new ArgumentNullException("studyYear");
            }

            if (studyYear.EndDate <= studyYear.BeginDate)
            {
                throw new Exception("Учебный год не может закончиться раньше, чем начаться.");
            }

            var sy = GetStudyYearByDate(studyYear.BeginDate);
            
            if (sy != null && sy.Id != studyYear.Id)
            {
                throw new Exception("Новый учебный год не может начинаться во время учебного года " + sy.Name + ".");
            }

            sy = GetStudyYearByDate(studyYear.EndDate);
            if (sy != null && sy.Id != studyYear.Id)
            {
                throw new Exception("Новый учебный год не может начинаться во время учебного года " + sy.Name + ".");
            }

            base.SaveOrUpdate(studyYear);
        }

        public StudyYear GetStudyYearByDate(DateTime date)
        {
            return _studyYearRepository.GetStudyYearByDate(date);
        }
    }
}